// 获取tabs配置
import tabsNameData from './tabsName'
/**
 * @description 这个方法波及范围--1.路由跳转逻辑 2.菜单操作逻辑 3.历史页签操作逻辑
 * @param {*} toPath 
 * @param {*} $store 
 * @param {*} routeFlag 
 * @param {*} route 为了方便获取路由传参新增参数--目测不影响其他项目
 */
export function routerHandle(toPath, $store, routeFlag = true, route) {
  // 定义唯一标识，判断是否已经找到
  let uniqueFlag = true;
  // 路由跳转清空面包屑上的方法
  routeFlag && $store.commit('changeLayoutHandle', {});
  // 收集面包屑地址
  let menuList = [];
  // 是否深层页面，深层页面需要添加返回按钮
  let flag = true;
  // 设置定时器获取结构树
  const getList = () => {
    menuList = $store.state.menuList;
    if (menuList.length) {
      iterator(menuList);
      // 地址栏截取到父级，再次递归获取面包屑
      if (flag) {
        $store.commit('isDeepPage', true);
      } else {
        $store.commit('isDeepPage', false);
      }
      // 执行完后唯一标识没有执行，所以，没找到对应的菜单，即没有菜单权限
      // if (uniqueFlag) {
      //   window.location.href = window.location.origin + `/#/?msg=${encodeURIComponent('非法页面，自动返回首页')}`;
      // }
    } else {
      setTimeout(() => {
        getList();
      }, 50);
    }
  };
  let pathArr = ['/login', '/', '/worktable', '/workbench'];
  if (pathArr.includes(toPath)) {
    setWhitePageTab($store, toPath)
  } else {
    getList()
  }
  // 迭代器，迭代结构树
  function iterator(list, path = toPath) {
    for (let i = 0; i < list.length; i++) {
      let thatUrl = list[i].resourcePath;
      let newPathUrl = thatUrl && thatUrl.substr(thatUrl.indexOf('/#/') + 2);
      // 不限制下级层级，同级可能存在：'/a/bc'.includes(/a/b)的情况，不做考虑
      // 同项目没有工程目录的问题，非同项目会有上诉问题，得做同源判定
      // 由于菜单出现了 '/a/bc'.includes(/a/b)的情况 现在要做考虑了
      const pathFlag = thatUrl && thatUrl.includes(window.location.pathname);
      if (newPathUrl && (path + '/').includes(newPathUrl + '/') && pathFlag && uniqueFlag) {
        // 进行分级地址的组合
        let idArr = list[i].idKey.split('-');
        if (newPathUrl === path) {
          // 非深层页面
          flag = false;
          // 设置选中菜单，直接用当前地址
          let urls = {
            url1: thatUrl,
            url2: path
          }
          $store.commit('setAppPathName', urls);
        } else {
          let lastPath = window.location.pathname + '#' + path;
          // 同级子目录
          let flag = list.some(item1 => {
            if (item1.resourcePath === lastPath) {
              idArr = item1.idKey.split('-');
              return true;
            }
          });
          // 设置选中菜单，采用路由页面
          let urls1 = {
            url1: lastPath,
            url2: path
          }
          let urls2 = {
            url1: thatUrl,
            url2: path
          }
          flag ? $store.commit('setAppPathName', urls1) : $store.commit('setAppPathName', urls2);
        }
        // 防止多次递归
        uniqueFlag = false;
        // 得到了最终的地址所在一级导航的下标
        let curList = menuList;
        let nameArr = [];
        idArr.forEach((item, index) => {
          curList.forEach(it => {
            if (it.idKey === idArr.slice(0, index + 1).join('-')) {
              nameArr.push(it.resourceName);
              curList = it.children;
            }
          });
        });
        // 将面包屑地址和所在的一级菜单
        $store.commit('changeActiveNameArr', nameArr);
        // 正常路由tab页签设置
        setPageTab($store, toPath, [...nameArr], route)
        // 常规不用跳转，因为本身就已经设置了
        if (routeFlag) {
          // 菜单展示相关
          $store.state.menuListTopNav.forEach((item,index)=>{
            if(list[i].supParentIndex === item.supParentIndex){
              $store.commit('changeTopNavIndex', index);
            }
          })
          $store.commit('changeActiveIndex', list[i].supParentIndex - 0);
        }
        break;
      }
      // 分别打断for
      if (!uniqueFlag) {
        break;
      }
      if (list[i].children && list[i].children.length) {
        iterator(list[i].children, path);
      }
    }
  }
}
/**
 * 普通页面添加到页签
 */
function setPageTab ($store, toPath, nameArr, route) {
  if ($store.state.tab && $store.state.tab.isShowTab) {
    let name = ''
    // console.log($store, 'path')
    let pathname = ''
    let appPathName = $store.state.appPathName.substr($store.state.appPathName.indexOf('/#/') + 2)
    if (toPath === appPathName) {
      name = (route.query && route.query.tabName) || nameArr.pop()
      pathname = toPath
    } else {
      const tabName = getTabsName(route.path)
      console.log(route, 'toute')
      name = (route.query && route.query.tabName) || tabName || (nameArr.pop() + '详情')
      pathname = window.location.hash.replace('#', '')
    }
    $store.dispatch('tab/push', {
      pathData: {
        name,
        pathname,
        closeable: true
      },
      flag: true
    });
  }
}
/**
 * 获取深层页面页签名称配置
 */
function getTabsName (path) {
  return tabsNameData[path]
}
/**
 * 白名单路由添加到tab页签
 */
function setWhitePageTab ($store, toPath) {
  let whitePageList = [
    {
      pathname: '/',
      name: '首页',
      closeable: false,
    },
    {
      pathname: '/worktable',
      name: '工作台',
      closeable: true
    }
  ]
  if ($store.state.tab && $store.state.tab.isShowTab) {
    let item = whitePageList.find(it => it.pathname === toPath)
    item && $store.dispatch('tab/push', {pathData: item})
  }
}
